Skip to content

배포 오류 hot-fix#44

Merged
choubung merged 4 commits intomasterfrom
dev
Nov 17, 2025
Merged

배포 오류 hot-fix#44
choubung merged 4 commits intomasterfrom
dev

Conversation

@choubung
Copy link
Copy Markdown
Owner

@choubung choubung commented Nov 17, 2025

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 클라이언트 측 로그아웃 기능 추가
  • 보안 개선

    • CSRF 보호 강화로 토큰 관리 개선
    • 프로덕션 환경에서 HTTPS 적용
  • 변경사항

    • 컨테이너 포트 변경 (8080 → 9090)
    • Bootstrap 버전 업데이트 (5.3.8 → 4.3.1)

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Nov 17, 2025

🐰 개요

프로덕션 환경 설정 활성화, 포트 변경(8080 → 9090), 환경별 보안 정책 분리(HTTPS/HTTP), CSRF 토큰 중앙화, 클라이언트 측 로그아웃 기능 추가, 테스트 보안 요청 업데이트.

변경 사항

코호트 / 파일 변경 요약
배포 및 컨테이너 설정
\.github/workflows/cd\.yml, Dockerfile
CD 파이프라인에 SPRING_PROFILES_ACTIVE=prod 환경 변수 추가; 컨테이너 노출 포트 8080에서 9090으로 변경
환경별 보안 정책
src/main/java/com/precourse/openMission/config/auth/SecurityConfig\.java
단일 보안 필터 체인을 두 개의 프로필별 bean으로 분리: prodFilterChain(HTTPS 강제), devFilterChain(HTTPS 미강제); 공유 설정을 commonSecurityConfig() 헬퍼 메서드로 추출
CSRF 토큰 중앙화
src/main/java/com/precourse/openMission/web/GlobalModelAdvice\.java
@ControllerAdvice 기반 새로운 클래스로 모든 컨트롤러에 _csrf 모델 속성 자동 제공
로그아웃 기능 및 템플릿
src/main/resources/static/js/app/index\.js, src/main/resources/templates/layout/header\.mustache
클라이언트 측 logout() 메서드 추가(CSRF 토큰 포함 POST); 헤더의 로그아웃 폼을 버튼 요소로 변경; Bootstrap 5.3.8에서 4.3.1로 다운그레이드; CSRF 메타 태그 추가
테스트 보안 요청
src/test/java/com/precourse/openMission/integration/IndexControllerTest\.java, src/test/java/com/precourse/openMission/integration/MemoIntegrationTest\.java
모든 MockMvc 요청에 .secure(true) 추가하여 HTTPS 프로토콜 강제

시퀀스 다이어그램

sequenceDiagram
    participant User
    participant UI
    participant Server as Spring App<br/>(prod)
    participant Session

    User->>UI: 로그아웃 버튼 클릭
    UI->>UI: logout() 메서드 실행
    UI->>UI: 메타 태그에서 CSRF 토큰 읽음
    UI->>Server: POST /logout (CSRF 토큰 포함)
    Server->>Server: HTTPS 강제 (prodFilterChain)
    Server->>Session: 세션 무효화
    Server->>UI: 리다이렉트 또는 응답
    UI->>User: 로그인 페이지로 이동
Loading

예상 코드 리뷰 소요 시간

🎯 3 (중간) | ⏱️ ~20분

추가 검토 항목:

  • SecurityConfig.java의 환경별 HTTPS 강제 로직이 prod 프로필에서만 활성화되는지 확인
  • GlobalModelAdvice의 CSRF 토큰이 모든 컨트롤러 뷰에 정상 주입되는지 검증
  • 클라이언트 측 로그아웃 흐름의 CSRF 토큰 추출 로직 정확성 확인
  • Bootstrap 버전 다운그레이드(5.3.8 → 4.3.1)로 인한 UI 호환성 영향 검토

관련 PR

제안 라벨

👩‍🔧 CI/CD

시 🐰

운영 환경에 맞춰
보안의 문을 다시 열고
CSRF의 방패를 나눠 들어
로그아웃 단추는 우아하게 ✨
포트 9090으로 도약한다 🚀

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive PR 제목 '배포 오류 hot-fix'는 배포 오류 수정을 언급하지만, 실제 변경사항은 포트 변경, 보안 설정 개선, CSRF 토큰 처리, Bootstrap 버전 변경 등 광범위합니다. 더 구체적인 제목으로 수정하세요 (예: '배포 환경별 보안 설정 및 포트 변경' 또는 변경 사항을 더 명확하게 반영하는 제목).
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch dev

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/cd.yml (1)

58-69: Cloud Run 명시적 포트 설정 필수

Dockerfile에서 포트 9090으로 변경되었으나 Cloud Run은 EXPOSE 지시어를 자동으로 감지하지 않습니다. Cloud Run은 기본값으로 포트 8080을 사용하며, 다른 포트가 필요한 경우 --port 플래그를 명시해야 합니다. 배포 실패를 방지하기 위해 다음과 같이 수정하세요:

flags: |
  --port=9090
  --min-instances=1
  --add-cloudsql-instances=${{ secrets.GCP_SQL_CONNECTION_NAME }}
🧹 Nitpick comments (1)
.github/workflows/cd.yml (1)

73-74: 불필요한 빈 줄 제거

SPRING_PROFILES_ACTIVE=prod 설정 후 불필요한 빈 줄이 있습니다.

-SPRING_PROFILES_ACTIVE=prod
-            
+SPRING_PROFILES_ACTIVE=prod
 DB_URL=jdbc:mysql://google/mydb?socketFactory=com.google.cloud.sql.mysql.SocketFactory&cloudSqlInstance=${{ secrets.GCP_SQL_CONNECTION_NAME }}&useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3673444 and ddfa728.

📒 Files selected for processing (8)
  • .github/workflows/cd.yml (1 hunks)
  • Dockerfile (1 hunks)
  • src/main/java/com/precourse/openMission/config/auth/SecurityConfig.java (2 hunks)
  • src/main/java/com/precourse/openMission/web/GlobalModelAdvice.java (1 hunks)
  • src/main/resources/static/js/app/index.js (3 hunks)
  • src/main/resources/templates/layout/header.mustache (2 hunks)
  • src/test/java/com/precourse/openMission/integration/IndexControllerTest.java (1 hunks)
  • src/test/java/com/precourse/openMission/integration/MemoIntegrationTest.java (10 hunks)
🔇 Additional comments (11)
src/main/java/com/precourse/openMission/web/GlobalModelAdvice.java (1)

1-20: LGTM!

CSRF 토큰을 모든 컨트롤러의 모델에 자동으로 추가하는 구현이 올바릅니다. header.mustache의 메타 태그 및 index.js의 클라이언트 측 로그아웃 흐름과 일관성 있게 작동합니다.

src/test/java/com/precourse/openMission/integration/IndexControllerTest.java (1)

40-41: LGTM!

HTTPS 요청 시뮬레이션 추가가 올바릅니다. SecurityConfig의 프로덕션 프로파일 HTTPS 강제와 일관성이 있습니다.

src/test/java/com/precourse/openMission/integration/MemoIntegrationTest.java (1)

117-117: LGTM!

모든 통합 테스트에 HTTPS 시뮬레이션이 추가되어 프로덕션 환경의 보안 설정을 올바르게 테스트합니다.

Also applies to: 150-150, 176-176, 210-210, 225-225, 245-245, 264-264, 280-280, 308-308, 326-326

src/main/resources/templates/layout/header.mustache (3)

6-8: LGTM!

CSRF 메타 태그가 올바르게 추가되어 클라이언트 측 로그아웃 기능과 일관성 있게 작동합니다.


26-26: 클라이언트 측 로그아웃 구현 확인됨

로그아웃이 서버 측 폼에서 클라이언트 측 JavaScript 처리로 변경되었습니다. index.jslogout() 함수와 올바르게 연결되어 있습니다.


5-5: 부트스트랩 버전 다운그레이드는 호환성 문제 없음

검증 결과, 템플릿 전체에서 Bootstrap 4 호환 패턴만 사용되고 있습니다:

  • data-toggle, data-target 속성 사용 (Bootstrap 4 표준)
  • Bootstrap 5 전용 속성(data-bs-) 없음
  • Bootstrap 5 전용 클래스(.btn-close, .offcanvas 등) 없음
  • form-check-input 클래스는 Bootstrap 4와 5 모두에서 지원됨

기존 코드가 이미 Bootstrap 4 방식으로 작성되어 있으므로, 5.3.8에서 4.3.1로의 다운그레이드는 안전합니다.

src/main/resources/static/js/app/index.js (2)

16-19: LGTM!

로그아웃 버튼 클릭 핸들러가 올바르게 구현되었습니다. 기본 링크 동작을 방지하고 커스텀 로그아웃 함수를 호출합니다.


110-130: 검증 완료: 로그아웃 구현이 올바르게 구성되어 있습니다.

SecurityConfig에서 CSRF 보호가 기본으로 활성화되어 있으며, 로그아웃 엔드포인트가 정확히 구성되어 있습니다:

  • CSRF는 명시적으로 비활성화되지 않았으므로 Spring Security에서 기본으로 활성화됨
  • /logout 엔드포인트는 POST 메서드로 기본 구성됨
  • 로그아웃 성공 후 "/" 로 리다이렉트 설정됨

index.js의 구현(메타 태그에서 CSRF 토큰 읽기 → 동적 폼 생성 → POST 제출)이 SecurityConfig와 완벽하게 일치하며, CSRF 보호가 제대로 작동합니다.

src/main/java/com/precourse/openMission/config/auth/SecurityConfig.java (2)

43-69: LGTM!

공통 보안 설정이 잘 추출되었습니다. 로그아웃 성공 URL(/), 인증 진입점, OAuth2 로그인 설정이 모두 올바르게 구성되어 있습니다.


22-41: 환경별 보안 설정 분리가 올바르게 구현됨

프로덕션과 개발 환경의 SecurityFilterChain을 분리하여 프로덕션에서만 HTTPS를 강제하는 것이 적절합니다. 공통 설정은 commonSecurityConfig 메서드로 잘 추출되었습니다.

검증 결과:

  • @Profile("prod")@Profile("!prod")가 상호 배타적으로 올바르게 설정됨
  • 두 빈 간 충돌 없음
  • 프로파일 활성화는 배포 환경에서 외부 설정(환경변수, JVM 인자 등)을 통해 관리되는 것으로 정상
Dockerfile (1)

7-7: 포트 설정이 일관성 있게 구성되어 있습니다

검증 결과, src/main/resources/application.properties:3server.port=${PORT:9090}으로 설정되어 있으며, Dockerfile의 EXPOSE 9090과 일치합니다. 애플리케이션 설정이 올바르게 구성되어 있으므로 추가 조치가 필요하지 않습니다.

@choubung choubung merged commit a8f22dd into master Nov 17, 2025
2 checks passed
@choubung choubung self-assigned this Nov 19, 2025
@choubung choubung added 🚨 bug Something isn't working 👩‍🔧 CI/CD labels Nov 19, 2025
@choubung choubung added this to the 2️⃣ 배포 milestone Nov 19, 2025
@choubung choubung linked an issue Nov 19, 2025 that may be closed by this pull request
1 task
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚨 bug Something isn't working 👩‍🔧 CI/CD

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

CI/CD: 배포

1 participant